package com.atguigu.tingshu.search.listener;

import com.atguigu.tingshu.search.service.impl.ItemServiceImpl;
import org.redisson.api.RBloomFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.util.List;

/**
 * 利用springboot的监听器机制完成对分布式布隆数据的同步
 */
//@Component --扫描机制 spi机制 手动放进去  listener一定要用spi机制
public class BloomFilterListener implements SpringApplicationRunListener {
    Logger logger = LoggerFactory.getLogger(this.getClass());
    /**
     * 该方法springBoot在启动过程(就包含了spring容器中应用定义的Bean对象都创建完毕)中会回调
     * @param context the application context.
     * @param timeTaken the time taken to start the application or {@code null} if unknown
     *
     *   started方法在容器启动的过程中调用两次
     *     第一次是springCloud的组件调用的。 ConfigurableApplicationContext spring容器里面是没有应用中定义好的Bean对象
     *     第二次是springBoot的组件调用的。 ConfigurableApplicationContext spring容器里面才有应用中定义好的Bean对象
     *
     */
    @Override
    public void started(ConfigurableApplicationContext context, Duration timeTaken) {
        // todo：分布式布隆的数据同步
        if (context.containsBean("rBloomFilter")){
            //1.从spring容器中获取到布隆过滤器的Bean对象
            RBloomFilter rBloomFilter = context.getBean("rBloomFilter", RBloomFilter.class);

            if (rBloomFilter.count() == 0){
                //2.从spring容器中获取应用的Bean对象
                ItemServiceImpl itemServiceImpl = context.getBean("itemServiceImpl", ItemServiceImpl.class);
                //3.获取数据
                List<Long> albumInfoIdList = itemServiceImpl.getAlbumInfoIdList();

                //4.将数据放到布隆过滤器中
                for (Long albumId : albumInfoIdList) {
                    rBloomFilter.add(albumId);
                }
                //5.布隆过滤器中元素是否同步过去
                logger.info("布隆过滤器中元素个数：{}",rBloomFilter.count());
            }
        }
    }
}
